#include <iostream>
#include <string>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_video.h>
#include <SDL/SDL_quit.h>
#include <SDL/SDL_audio.h>
#include <SDL/SDL_ttf.h>

using namespace std;


void iniciarVideo();
void iniciarAudio();
SDL_Surface* iniciarPantalla();
void inicializarAudio();
void colocarTitulo(string mensaje);
SDL_Surface* cargarImagen(string nombre);
Mix_Music* cargarSonido(string nombre);
void play(Mix_Music * sonido);
void posicionarVentana(SDL_Rect* posDestino, SDL_Surface *img);
void ponerImagenEnPantalla(SDL_Surface* img,SDL_Surface* pantalla,SDL_Rect* posDestino);
void actualizar(SDL_Surface* pantalla);
void manejarEventos();
void terminarAudio(Mix_Music* sonido);
void terminarVideo(SDL_Surface *img,SDL_Surface *pantalla);
void terminarSDL();



int main()
{
	//////////////////////////////////////////////
	/* iniciacion de las variables:*/
	SDL_Surface *pantalla,*img;	//Esta será nuestra pantalla //aqui cargaremos la imagen
	Mix_Music *sonido;	//Aqui cargaremos el archivo de sonido
	SDL_Rect posDestino; //lo utilizamos para indicar en que parte de screen vamos a colocar la imagen
	/////////////////////////////////////////////

	iniciarVideo();
	iniciarAudio();

	pantalla = iniciarPantalla();
	inicializarAudio();		
	
	colocarTitulo("Imagen y video :D");

	img = cargarImagen("imagen.png");
	sonido = cargarSonido("china.mp3");

	play(sonido);

	posicionarVentana(&posDestino,img);
	
	ponerImagenEnPantalla(img,pantalla,&posDestino);
	
	actualizar(pantalla);

	manejarEventos();

	terminarAudio(sonido);
	terminarVideo(img,pantalla);

	terminarSDL();

	
	return 0;
}



void iniciarVideo(){

	if (SDL_Init(SDL_INIT_VIDEO) == -1)
		cout << "Error al iniciar SDL (video): "<< SDL_GetError() << endl;
		
}


void iniciarAudio(){
	if (SDL_Init(SDL_INIT_AUDIO) == -1)
		cout << "Error al iniciar SDL (audio): "<< SDL_GetError() << endl;
	
}

SDL_Surface *iniciarPantalla(){

	SDL_Surface* pantalla = SDL_SetVideoMode(320, 240, 16, SDL_HWSURFACE);
	//verificamos si ha ocurrido algun error con el video
	if (pantalla == NULL){
		cout << "Error estableciendo el modo de video: "<<	SDL_GetError() <<endl;
	}
	
	return pantalla;

}



void inicializarAudio(){
	//inicializamos un formato de audio
	if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1){ //el 2 es para estereo
		cout << "Error en Mix_OpenAudio: " << Mix_GetError() << endl;
	}
}


void colocarTitulo(string mensaje){

	//colocamos un mensaje o el nombre de la ventana
	SDL_WM_SetCaption(mensaje.c_str(), NULL);


}

SDL_Surface* cargarImagen(string nombre){

		
	//cargamos la imagen en la suprficie
	SDL_Surface* img = IMG_Load(nombre.c_str());	
	//verificamos si ha ocurrido algun error cargando
	//la imagen
	if (img == NULL){
		cout << "Error en IMG_Load= "<< SDL_GetError()<< endl;
	}
	
	return img;

}

Mix_Music*  cargarSonido(string nombre){

	//Cargamos el archivo de sonido
	Mix_Music* sonido = Mix_LoadMUS(nombre.c_str());
	//verificamos si ocurrio algun error
	//al cargar el archivo dee sonido
	if (!sonido){
		cout << "Error en Mix_LoadMUS: "<<Mix_GetError() << endl;

	}
return sonido;

}

void play(Mix_Music * sonido){

		Mix_PlayMusic(sonido, 1);


}


void posicionarVentana(SDL_Rect* posDestino, SDL_Surface *img){

	posDestino->x = 320/2 - img->w/2; //posicion en el ejex
	posDestino->y = 240/2 - img->h/2; //posicion en el ejey
	posDestino->w = posDestino->h = 0;

}


void ponerImagenEnPantalla(SDL_Surface* img,SDL_Surface* pantalla,SDL_Rect* posDestino){
	SDL_BlitSurface(img, NULL, pantalla, posDestino); //copiamos img en screen
}

void actualizar(SDL_Surface* pantalla){

	SDL_Flip(pantalla);//mostrtamos screen en pantalla

}

void manejarEventos(){
	SDL_Event eventSDL; //Manejador de eventos
	
		//mientras salir no sea 1 continua
	int salir = 0;
	while(not salir)
	{
		SDL_PollEvent(&eventSDL); //escuchamos un evento externo
		
		switch(eventSDL.key.keysym.sym){
		case SDLK_ESCAPE:
			salir = true;
			break;
		case SDLK_p:
			Mix_PauseMusic();
			cout << "pausa" << endl;
			break;
		case SDLK_UP:
			Mix_VolumeMusic(Mix_VolumeMusic(-1)+1) ;
			cout << "vol+" << endl;
			break;
				
		case SDLK_DOWN:
			Mix_VolumeMusic(Mix_VolumeMusic(-1)-1) ;
			cout << "vol-" << endl;
			break;
				
		case SDLK_SPACE:
			Mix_ResumeMusic();
			cout << "sigue.." << endl;
			break;
			
		case SDLK_r:
			Mix_RewindMusic();
			cout << "vamos de nuevo" << endl;
			break;
		
		case SDLK_RIGHT:
			Mix_SetMusicPosition(10);
			cout << "posicion10" << endl;
			break;
 
 		case SDLK_LEFT:
			Mix_SetMusicPosition(5);
			cout << "posicion5" << endl;
			break;
 
				
		}
		//esperamos 10 ms
		SDL_Delay(10);
	}


}

void terminarAudio(Mix_Music* sonido){

	
	//si sonido no es null, lo apagamos y liberamos memoria
	if (sonido != NULL){
		Mix_HaltMusic();
		Mix_FreeMusic(sonido);
	}

	Mix_CloseAudio(); //apagamos el audio



}

void terminarVideo(SDL_Surface *img,SDL_Surface *pantalla){

	SDL_FreeSurface(img); //liberamos img
	SDL_FreeSurface(pantalla); //liberamos la superficie


}

void terminarSDL(){
	SDL_Quit();
}
